package com.naiterui.common.redis.template;

import com.naiterui.common.redis.util.MessageDelegate;

import java.util.Map;

/**
 * Redis Pubsub Operation Template
 */
public interface IRedisPubsubTemplate {

    /**
     * 将信息 message 发送到指定的频道 channel
     * 返回，收到消息的客户端数量
     *
     * @param channel
     * @param message
     *
     * @return
     */
    Long publish(String channel, String message);

    /**
     * 订阅给指定频道的信息
     * 一旦客户端进入订阅状态，客户端就只可接受订阅相关的命令
     * SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE和PUNSUBSCRIBE除了这些命令，其他命令一律忽略
     * @param jedisPubSub
     * @param channels
     */
    //void subscribe(JedisPubSub jedisPubSub, String... channels);

    /**
     * 订阅给定的模式(patterns)。
     * 支持的模式(patterns)有:
     * h?llo : hello , hallo , hxllo
     * h*llo : hllo , heeeello
     * h[ae]llo : hello , hallo 不包括 hillo
     * 如果想输入普通的字符，可以在前面添加\
     * @param jedisPubSub
     * @param patterns
     */
    //void psubscribe(JedisPubSub jedisPubSub, String... patterns);

    /**
     * 订阅给指定频道的信息
     * 一旦客户端进入订阅状态，客户端就只可接受订阅相关的命令
     * SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE和PUNSUBSCRIBE除了这些命令，其他命令一律忽略
     *
     * @param messageDelegate
     * @param channels
     */
    void subscribe(MessageDelegate messageDelegate, String... channels);

    /**
     * 订阅给定的模式(patterns)。
     * 支持的模式(patterns)有:
     * h?llo : hello , hallo , hxllo
     * h*llo : hllo , heeeello
     * h[ae]llo : hello , hallo 不包括 hillo
     * 如果想输入普通的字符，可以在前面添加\
     *
     * @param messageDelegate
     * @param patterns
     */
    void psubscribe(MessageDelegate messageDelegate, String... patterns);

    /**
     * TODO 不使用
     *
     * @param channels
     *
     * @return
     */
    Map<String, String> pubsubNumSub(String... channels);

    /**
     * TODO 不使用
     *
     * @param patterns
     *
     * @return
     */
    Long pubsubNumPat(String... patterns);

}
